Szerkesztő:GumiBot/code25

A Wikipédiából, a szabad enciklopédiából

A(z) 25. kódú hibát javító kódrészlet[szerkesztés]

sub fix_25 {	# Headline hierarchy
    my ($error_code, $title_str, $text_str) = @_;

    my $excluded = search_tags($text_str);
    my $titles = search_tags($text_str, [
            ['^=+', '=+ *$'],
        ], $excluded);

    my @titles = ( {min => 0, max => 0, level => 1,} ); # strazsa
    while ($titles) {
        (my $title, $titles) = $titles->first;
        my $pos = $title->min;
        my $len = $title->max-$title->min+1;
        my $heading = substr($text_str, $pos, $len);
        $heading =~ /^(=+)(.*?)=+ *$/ms;
        my $level = length($1);
        push(@titles, {
            'pos'   => $pos,
            len     => $len,
            level   => $level,
            heading => $2,
        });
    }

    my $tree = sectiontree([@titles]);
    compact_tree($tree, 1);
    shift @titles;                                      # strazsa ki

    my $count = 0;
    foreach (reverse @titles) {
        return ('Nem javithato, 19-es hiba') if $_->{newlevel} == 0;
        next if $_->{level} == $_->{newlevel};
        my $marker = '=' x $_->{newlevel};
        substr($text_str, $_->{pos}, $_->{len}) = "$marker$_->{heading}$marker";
        $count++;
    }
    $count or return ('Nem hibas a szakaszhierarchia');

    my $summary_str = $latin2->decode(
        "Bot: $count szakaszcím feljebb igazítva a hierarchiában. (Hibakód: $error_code)"
    );
    return ($summary_str, $count, $text_str);
} #

sub sectiontree {
    my $sectlist = shift;
    my $item = shift(@{$sectlist});
    my $rootlevel =  $item->{level};
    my $root = {
        node        => $item,
        children    => [],
    };
    while (ref $sectlist->[0] eq 'HASH' and
            $sectlist->[0]->{level} > $rootlevel) {
        my $subtree = sectiontree($sectlist);
        push(@{$root->{children}}, $subtree);
    }
    return $root;
} #

sub compact_tree {
    my ($root, $level) = @_;
    $root->{node}->{newlevel} = $level;
    foreach (@{$root->{children}}) {
        compact_tree($_, $level+1);
    }
    return $root;
}